#include "fonctions.h"

void envoyerClient (char* mess, int socket) {
	if (send(socket,mess,strlen(mess)+1,0)<0)
	     perror ("probleme émission:");
	printf("J'écris sur %d\n",socket);    
}

void verifierCode(char* buff, char *resultat) {
	strcpy(resultat, "aaa");
}

void lancerPartieJoueurCodeur (user_t codeur, user_t devineur, int maxEssais) {
	int nbEssai=0, nbRecu;
	int trouve = 0, messValid = 0;
	char buffer[255];
	int bien=0, mal=0, nbTriche=0;
	char resultat[3];
	char resultatUser[3];


	while (nbEssai < maxEssais || trouve != 1) {
		nbEssai++;
		//Recevoir de l'autre thread
		sem_wait(&codeur.attente);
		strcpy (buffer, codeur.buffer);
		
		verifierCode(buffer, resultat);
		if (resultat == NULL) {
			envoyerClient ("L'adversaire a trouvé le code ! ", codeur.clientSocket);
			nbEssai--;
				
			//Envoyer au thread de celui qui devine le code "buffer"
			sprintf(resultatUser, "%d", -1);
			strcpy (devineur.buffer, resultatUser); 
			sem_post(&devineur.attente);
		}
		else {
		
			//Afficher le code saisi
			envoyerClient (strcat("Code saisi par l'adversaire : ", buffer), codeur.clientSocket);
		
			//Demander le nombre de bien placés
			messValid = 0;
			while (messValid != 1) {
				envoyerClient ("Nombre de bien placés : ", codeur.clientSocket);
				nbRecu= recv(codeur.clientSocket,buffer,512,0);
		
				if (nbRecu == 0) {
				 	printf("Client deconnecté brutalement.\n");
		 			disconnect(codeur.clientSocket);
		 		}
		 		if (buffer[0] == 'M')
		 			messValid = 1;
			}
			sscanf(buffer,"M%d",&bien);
		
			//Demander le nombre de mal placés
			messValid = 0;
			while (messValid != 1) {
				envoyerClient ("Nombre de bien placés : ", codeur.clientSocket);
				nbRecu= recv(codeur.clientSocket,buffer,512,0);
		
				if (nbRecu == 0) {
				 	printf("Client deconnecté brutalement.\n");
		 			disconnect(codeur.clientSocket);
		 		}
		 		if (buffer[0] == 'M')
		 			messValid = 1;
			}
			sscanf(buffer,"M%d",&mal);
		
			//Generer chaine
			sprintf(resultatUser, "%d %d", bien, mal);
			if (strcmp(resultat, resultatUser) != 0)
				//triche
				nbTriche++;
				
			//Envoyer au thread de celui qui devine le code "buffer"
			strcpy (devineur.buffer, resultatUser); 
			sem_post(&devineur.attente);
		
		}
	}
	codeur.score = compterPoints (nbEssai, maxEssais, 0, nbTriche);
}


void lancerPartieJoueurDevineur (user_t codeur, user_t devineur, int maxEssais) {
	int nbEssai=0;
	int trouve = 0, messValid = 0;
	char buffer[255];
	int nbRecu;
	int bien, mal;

	
	while (nbEssai < maxEssais || trouve != 1) {
		messValid = 0;
		while (messValid != 1) {
			envoyerClient ("Veuiller saisir le code: ", devineur.clientSocket);
			nbRecu= recv(devineur.clientSocket,buffer,512,0);
		
			if (nbRecu == 0) {
			 	printf("Client deconnecté brutalement.\n");
	 			disconnect(devineur.clientSocket);
	 		}
	 		if (buffer[0] == 'M')
	 			messValid = 1;
		}
		
		sscanf(buffer,"M%s", buffer);
		
		//Envoyer au thread de celui qui fait le code "buffer"
		strcpy (codeur.buffer, buffer); 
		sem_post(&codeur.attente);
		
		//Recevoir de l'autre thread
		sem_wait(&devineur.attente);
		strcpy (buffer, devineur.buffer);
		
		sscanf(buffer, "%d", &bien);
		if (bien == -1) {
			//Partie gagnée
			trouve = 1;
			nbEssai--;
		}
		else {
			char* envoyer;
			
			sscanf(buffer, "%d %d", &bien, &mal);
			sprintf(envoyer, "%d bien places, %d mal places.", bien, mal);
		
			envoyerClient (envoyer, devineur.clientSocket);
		}
		nbEssai++;
	}
	devineur.score = compterPoints (nbEssai, maxEssais, 1, 0);
}

void disconnect (int numSocket) {
	printf("Fermeture de la socket %d\n", numSocket);
	close(numSocket);
	pthread_exit(NULL);
}


//0 : donne le code
//1 : devine le code
int compterPoints (int nbEssais, int maxEssais, int role, int nbTriche) {
	if (role == 1) {
		return (maxEssais - nbEssais);
	}
	else
		return (nbEssais - nbTriche);
}


